package com.boil.qz.safekavass.web.controller;

import com.boil.pojo.ResultVo;
import com.boil.util.Constants;
import com.boil.util.FastJsonUtils;
import com.boil.util.OkBaseController;
import org.apache.shiro.session.Session;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Created by ChenYong on 2015-11-24.
 * <br>
 * 错误 Controller。
 */
@Controller
@RequestMapping("/web/error")
public class ErrorController extends OkBaseController {
    /**
     * 403 页面。
     * <br>
     * <span style="color: red">未授权访问。</span>
     *
     * @param model 模型
     * @return 403 页面-“view/error/403.jsp”
     */
    @RequestMapping(method = RequestMethod.GET, value = "/403.html")
    public String error403(Model model) {
        return "/error/403";
    }

    /**
     * 403 页面。
     * <br>
     * <span style="color: red">未授权访问。</span>
     *
     * @param model 模型
     * @return 重定向到 403 页面/结果 Json
     */
    @RequestMapping(method = RequestMethod.GET, value = "/403/1.html")
    public ModelAndView error403_1(Model model) {
        // 获取 Session
        Session session = getSession();
        // 获取请求类型
        int requestType = (Integer) session.getAttribute(Constants.REQUEST_TYPE_STR);
        // 获取菜单 ID
        long menuId = (Long) session.getAttribute(Constants.MENU_ID);
        // 获取菜单父 ID
        long menuParentId = (Long) session.getAttribute(Constants.MENU_PARENT_ID);

        // 如果是普通请求
        if (requestType == Constants.VALUE_1) {
            return new ModelAndView(String.format("redirect:/web/error/403.html?menuId=%s&menuParentId=%s", menuId, menuParentId));

            // 否则是 Ajax 请求/JSON 请求
        } else {
            ResultVo resultVo = new ResultVo();
            resultVo.setResultCode(Constants.ERROR_403);
            resultVo.setResultMsg(Constants.ERROR_403_MSG);

            // 如果是 Ajax 请求
            if (requestType == Constants.VALUE_2) {
                // 未授权访问：403
                response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            }

            PrintWriter pw = null;

            try {
                pw = response.getWriter();

                pw.write(FastJsonUtils.bean2Json(resultVo));
            } catch (IOException e) {
                log.error("Ajax 请求/JSON 请求--->响应请求参数不合法时出现异常，异常信息如下：{}", e);
            } finally {
                try {
                    if (pw != null) {
                        pw.close();
                    }
                } catch (Exception e) {
                    log.error("Ajax 请求/JSON 请求--->响应请求参数不合法，关闭响应流时出现异常，异常信息如下：{}", e);
                }
            }

            return null;
        }
    }

    /**
     * 404 页面。
     * <br>
     * <span style="color: red">页面未找到。</span>
     *
     * @param model 模型
     * @return 404 页面-“view/error/404.jsp”
     */
    @RequestMapping(method = RequestMethod.GET, value = "/404.html")
    public String error404(Model model) {
        return "/error/404";
    }

    /**
     * 404 页面。
     * <br>
     * <span style="color: red">页面未找到。</span>
     *
     * @param model 模型
     * @return 404 页面-“view/error/404.jsp”
     */
    @RequestMapping(method = RequestMethod.GET, value = "/404/1.html")
    public String error404_1(Model model) {
        return "redirect:/web/error/404.html";
    }

    /**
     * 412 页面。
     * <br>
     * <span style="color: red">请求参数不合法。</span>
     *
     * @param model 模型
     * @return 参数校验失败的页面-“view/error/412.jsp”
     */
    @RequestMapping(method = RequestMethod.GET, value = "/412.html")
    public String error412(Model model) {
        Session session = getSession();
        ResultVo resultVo = (ResultVo) session.getAttribute(Constants.ERROR_412_STR);

        session.removeAttribute(Constants.ERROR_412_STR);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        return "/error/412";
    }

    /**
     * 500 页面。
     * <br>
     * <span style="color: red">服务器内部错误。</span>
     *
     * @param model 模型
     * @return 500 页面-“view/error/500.jsp”
     */
    @RequestMapping(method = RequestMethod.GET, value = "/500.html")
    public String error500(Model model) {
        Session session = getSession();
        ResultVo resultVo = (ResultVo) session.getAttribute(Constants.ERROR_500_STR);

        session.removeAttribute(Constants.ERROR_500_STR);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        return "/error/500";
    }
}